//
//  CZStatusesViewModel.swift
//  SinaBlog
//
//  Created by 李超 on 16/3/24.
//  Copyright © 2016年 lichao. All rights reserved.
//

import UIKit
import SDWebImage

class CZStatusesViewModel: NSObject {
    
    //保存statuses对象
    var status:CZStatuses?
    //设置成全局的单例对象
    static let shareInstance:CZStatusesViewModel = CZStatusesViewModel()
    //重写构造方法，确保全局仅有一个单例
    private override init() {
      super.init()
       
    }
    //用于记录当前是否在加载信息的变量
    var loadingStatuse:Bool = false
    //用于下载原创或者转发微博中的单张配图的
     func cacheSingleWebImage(statuses: [CZStatuses], finished: (statuses: [CZStatuses]?, error: NSError?) -> ()){
        
        var length = 0.0
        //创建GCDgroup
        let group = dispatch_group_create()
        //遍历数组模型
        for status in statuses{
            
           var downloadURLS = status.pictureUrls
            //先判断原创有没有
            if downloadURLS == nil {
                
                downloadURLS = status.retweeted_status?.pictureUrls
            }
            //判断转发有没有,如果没有则继续遍历下一个模型
            if downloadURLS == nil {
                
                downloadURLS = nil
                continue
            }
            
            let count = downloadURLS?.count
            //判断配图的数量，仅处理配置只有1张的
            if count == 1 {
              let url = downloadURLS?.last
              //开始进入任务
              dispatch_group_enter(group)
                
              SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (image, error, _, _, _) -> Void in
                //执行完下载任务,退出组
                dispatch_group_leave(group)
                if error != nil {
                    return
                    
                }
                
                let data = UIImagePNGRepresentation(image)!
                length += Double(data.length)
                
              })
                
               
                
            }
            
        }
        //完成遍历后执行收到下载完成通知后的代码
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            
          finished(statuses: statuses, error: nil)
          
         // print("\(length / 1024.0 / 1024.0)")
            
        }
        
        
    }
    //添加加载用户statuses信息的方法
    func loadUserStatusesInfo(since_id:Int64,max_id:Int64,finished:(statuses:[CZStatuses]?,error:NSError?) ->()){
        //先进行判断当前是否有下载任务
        if !self.loadingStatuse{
            let error = CZNetworkToolError.StatusLoading.error()
            finished(statuses: nil, error: error)
        }
        //没有下载任务，则开始执行下载任务，并把状态更改为正在下载
        self.loadingStatuse = true
        //确保有值才做下一步
        guard let access_token = CZUserAccountTool.shareInstance.userAccount?.access_token else{
           // print("access_token为空")
            finished(statuses: nil, error: CZNetworkToolError.AccessTokenEmpty.error())
            return
        }
        //拼接参数
        let urlString = "https://api.weibo.com/2/statuses/home_timeline.json"
        var parameters:[String : AnyObject] = ["access_token":access_token]
        //根据所提供的id来拼接参数
        if since_id > 0{
            parameters["since_id"] = NSNumber(longLong: since_id)
        }else if max_id > 0{
            //返回的数据的第一条与原来的数据的最后一条重复，通过减一来避免重复
           parameters["max_id"] = NSNumber(longLong: max_id-1)
        }
        CZNetworkTool.shareInstance.requestGet(urlString, parameters: parameters) { (result, error) -> () in
            //在下载完成后的回调中将状态设置为无人下载
            self.loadingStatuse = false            
            //获取对应key值得数组
            if let array = result?["statuses"] as? [[String : AnyObject]]{            
            var statuses = [CZStatuses]()
            //遍历数组，并建成相应的模型
                for dict in array{
                   //字典转模型
                 //  print("status模型:\(dict)")
                  let status = CZStatuses(dict: dict)
                   // print("status模型：\(status)")
                  //添加到数组中
                   statuses.append(status)
                }
                //把模型交由下载单张照片的函数进一步处理，回调在下载完成单张照片后调用,将回调做参数传给下载函数
                self.cacheSingleWebImage(statuses, finished: finished)
              //解析完数据，执行回调
             // finished(statuses: statuses, error: error)
            }else{
                //如果没有数据，则不需要讲模型转交给下载单张照片的函数处理
                finished(statuses: nil, error: nil)
            }
        }
    }

}
